package com.ylr.redis.config;

import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.redisson.config.SingleServerConfig;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * Created by IntelliJ IDEA.
 *
 * @author wei
 * date: 2020-01-17 13:41:00
 * className: RedissonConfig Redisson分布式锁配置类
 * version: 1.0
 * description:
 *   Redisson分布式锁信息配置：
 *   1、使用redis作为锁存储方式
 *   2、配置连接redis信息
 */
@Configuration
//@ConditionalOnProperty(name = "redisson.enabled", havingValue = "true")
public class RedissonConfig {

    /*
        错误: Redis url should start with redis:// or rediss:// (for SSL connection)
        解决办法：addNodeAddress方法的地址前面加上：redis://
     */

    /**
     * 端口
     */
    @Value("${redisson.port}")
    private String port;

    /**
     * 连接地址
     */
    @Value("${redisson.url}")
    private String url;

    /**
     * 连接密码
     */
    @Value("${redisson.password}")
    private String password;

    /**
     * 使用的数据库编号
     */
    @Value("${redisson.database}")
    private Integer database;

    /**
     * 连接线程数
     */
    @Value("${redisson.pool.threads}")
    private Integer threads;

    /**
     * netty连接线程数
     */
    @Value("${redisson.pool.netty-threads}")
    private Integer nettyThreads;

    /**
     * 配置Redisson客户端，并将其注入Spring容器中
     */
    @Bean(destroyMethod = "shutdown")
    public RedissonClient redissonClient() {
        // redisson连接配置
        Config config = new Config();
        // 使用单例模式
        SingleServerConfig singleServerConfig = config.useSingleServer();
        // 设置连接地址、设置连接密码（如果连接密码为空，则该值不需要设置）、设置连接存活模式（保持连接存活）和使用的数据库下标
        singleServerConfig.setAddress("redis://" + url + ":" + port)
                .setKeepAlive(true)
                .setDatabase(database);
        if (!isBlank(password)) {
            singleServerConfig.setPassword(password);
        }

        // 此处要配置Redis线程池
        config.setThreads(threads);
        config.setNettyThreads(nettyThreads);

        // 根据配置创建实例
        return Redisson.create(config);
    }

    /**
     * 判断字符串数值是否为空
     * @param value 等待判断的之
     * @return 判断结果
     */
    private static boolean isBlank(CharSequence value) {
        int strLen = value == null ? 0 : value.length();
        if (strLen != 0) {
            for (int i = 0; i < strLen; ++i) {
                if (!Character.isWhitespace(value.charAt(i))) {
                    return false;
                }
            }
        }
        return true;
    }
}
